/**
 * Created with CLion.
 * Description: 声音类，主要包括播放的声音参数，以及默认的讯飞appid
 * User: loong
 * Date: 2019-12-08
 * Time: 16:53
 */

#include <wiringPi.h>
#include <pthread.h>
#include "MyPcm.h"
#include <alsa/asoundlib.h>
#include "../utils/MyTimeHelper.h"
#include <msp_cmn.h>
#include <qtts.h>
#include <qisr.h>


//语音控制指示灯，表示说话时灯亮，可以识别时灯灭
#define VOICE_LIGHT_PIN  7

#define SWITCH_ON   48              //开关标识，开
#define SWITCH_OFF  49              //开关标识，关
#define NETWORK_CONNECTED    111    //网络连接成功标志
#define NETWORK_DISCONNECTED 222    //网络连接失败标志

/**
 * 预置信息
 */
#define XFYUN_APPID_LEN         20     //科大讯飞开发包的APPID
#define USB_AUDIO_ADDR_LEN      50     //USB声卡的地址信息
#define ARECORD_PROCESS_CMD_LEN 117+USB_AUDIO_ADDR_LEN //录音进程命令字符数量
#define PARAMS_LEN              135   //输出语音的参数空间大小

/**
 * 科大讯飞语音读写需要
 */
#define BUFFER_SIZE     4096
#define FRAME_LEN       640
#define HINTS_SIZE      100

typedef struct {
    bool flag;
    int voice_main_switch;                                  //声音总开关（如果语音初始化失败，则为关闭状态！）
    int recongnition_switch;                                //标识当前是否打开语音识别 （高）
    int sound_box_ongoing_flag;                             //标识当前音箱状态，等于0为没有说话，小于0为正在说话
    char voice_recongnition_text[BUFFER_SIZE];              //音频转换成文字后保存到这里
    char output_voice_params[PARAMS_LEN];                   //音频输出的参数包括：发音人，语速，音量，语调
    pthread_mutex_t mutex_voice_params;                     //声音参数内存空间的线程锁

    char xfyun_appid[XFYUN_APPID_LEN];                      //科大讯飞提供的树莓派开发包的appid; （字符串长度暂定）
    char usb_audio_addr[USB_AUDIO_ADDR_LEN];                //USB声卡的地址信息（字符串长度暂定）
} Voice;


/**
 * 功能：初始化语音模块
 * @param audio_addr        音频地址
 */
int device_init(const char *audio_addr);

/**
 * 功能：讯飞初始化
 * @param xfyun_appid 讯飞appid
 * @return 0为已经登录，-1为错误。
 */
int xfyun_init(const char *xfyun_appid);

/**
 * 功能：设置声音播放参数初始化
 * @param voice_name    发音人，不同的发音人代表了不同的音色，如男声、女声、童声等，
 * @param speed         语速，合成音频对应的语速，取值范围：[0,100]，数值越大语速越快。
 * @param volume        音量，合成音频的音量，取值范围：[0,100]，数值越大音量越大。
 * @param pitch         语调，合成音频的音调，取值范围：[0,100]，数值越大音调越高。
 * @param bgm           背景音，合成音频中的背景音，支持参数：0：无背景音乐，1：有背景音乐
 * @return              成功返回0，失败返回-1。
 */
int set_voice_params(char *voice_name, int speed, int volume, int pitch, int bgm);

/**
 * 功能：文字转声音并播放（在线播放）
 * @param src_text 转换文字
 * @return 错误返回-1，正确返回0.
 */
int text_to_speech(char *src_text);

/**
 * 功能：语音识别
 * @return 错误返回-1，正确返回0.
 */
char *speech_recognition();

/**
 * 功能：讯飞云进行语音合成
 * @param handle        pcm设备句柄
 * @param src_text      需要转成的文字
 * @param size          数据块长度
 * @return              错误返回讯飞错误码
 */
int xfyun_tts(char *src_text, const char *des_path, const char *params);

/**
 * 功能：讯飞语音识别，根据文件输出识别文字
 * @param audio_file    输入语音文件
 * @return 返回识别文字
 */
char *xfyun_speech_recognition(const char *audio_file);

/**
 * 功能：利用当前时间，对生成的语音文件进行命名
 */
char *getCaptureAudioFileName();

/**
 * 功能：利用当前时间，对播放的语音文件进行命名
 */
char *getPlayAudioFileName();

/**
 * 功能：语音识别，将讯飞语音新识别和音频捕捉集成
 * @return 返回识别后的字符
 */
char * speech_recognition();

